export const deconstructionFunc = () => {
//可以从数组、对象中提取值，按照对应位置，对变量赋值
//只要等号两边的模式相同，左边的变量就会被赋予对应的值
//数组的元素是按次序排列的，变量的取值由它的位置决定；而对象的属性没有次序，变量必须与属性同名，才能取到正确的值。
    let [foo, [[bar], baz]] = [1, [[2], 3]]
    console.log('等号两边模式相同就能成功解构：let [foo, [[bar], baz]] = [1, [[2], 3]] => ', foo, bar, baz)
    let [bar1, foo1] = [1]
    console.log('解构不成功就会被赋予 undefined：let [bar1, foo1] = [1] => foo =', foo1, '还可以不完全解构：bar1 =' + bar1)
    try {
        let [a] = false
        console.log(a)
    } catch (error) {
        console.error('等号右边不可遍历则会报错：let [foo] = false 或 let [foo] = {} => ' + error)
    }
    //Set也可以使用解构

    //使用默认值 只有当一个数组成员严格等于undefined，默认值才会生效
    let [x1 = 1] = [undefined]
    console.log('let [x1 = 1] = [undefined] => x1 =', x1)
    let [x2 = 1] = [null]
    console.log('指定初始值失败：let [x2 = 1] = [null] => x2 =', x2)
    try {
        let { x3: baz } = { x3: 'aaa', x4: 'bbb' }
        console.log("let { x3: baz } = { x3: 'aaa', x4: 'bbb' } baz =", baz)
        console.log(x3)
    } catch (error) {
        console.error('x3 是匹配的模式 baz 才是变量 x3 =>' + error)
    }

    //对象的解构赋值可以取到继承的属性
    {
        const obj1 = {};
        const obj2 = { foo: 'dad' };
        Object.setPrototypeOf(obj1, obj2);

        let { foo } = obj1;
        console.log('对象的解构赋值可以取到继承的属性 => ' + foo)
    }
    console.warn('let x;{x} = {x: 1}; JavaScript 引擎会将{x}理解成一个代码块 应该用圆括号包裹：({x} = {x: 1})')
    //尽量不要在模式中放置圆括号 仅在赋值语句的非模式部分，可以使用圆括号
    console.warn('尽量不要在模式中放置圆括号 仅在赋值语句的非模式部分，可以使用圆括号')

    //可以对数组进行对象属性的解构
    let arr = [1, 2, 3]
    let {0 : first, [arr.length - 1] : last} = arr
    console.log('可以对数组进行对象属性的解构 {0 : first, 2 : last} = [1, 2, 3] => first =', first, 'last =' + last)

    //对字符串进行解构
    const [a, b, c, d, e] = 'hello'
    console.log('const [a, b, c, d, e] = "hello" => b = "' + b + '"')
    let {length : len} = 'hello'
    console.log("let {length : len} = 'hello' => len = " + len)

    //对数值和布尔值解构
    let {toString: s} = 123
    console.log('对数值和布尔值解构 let {toString: s} = 123/true => s === Number.prototype.toString ? ', s === Number.prototype.toString)

    let q = 1;
    let p = 2;
    [q, p] = [p, q]
    console.log('----------用途----------')
    console.log('交换变量的值 [q, p] = [p, q]')
    console.log('用于函数参数和返回 f([1, 2, 3]) 、 let [a, b, c] = example()')
    console.log('提取 JSON 数据 和 遍历 Map 结构')
}